HEX
Server: LiteSpeed
System: Linux eticaretsrv4.isimtescil.net 3.10.0-962.3.2.lve1.5.26.7.el7.x86_64 #1 SMP Wed Oct 2 07:53:12 EDT 2019 x86_64
User: sioberen (1086)
PHP: 7.3.33
Disabled: NONE
Upload Files
File: //opt/alt/python37/lib/python3.7/site-packages/clwizard/modules/lsapi.py
# coding=utf-8
#
# Copyright CloudLinux Zug GmbH 2010-2018 All Rights Reserved
# Licensed under CLOUD LINUX ZUG GMBH LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENCE.TXT
#

from __future__ import absolute_import
import os

from typing import Dict, List  # NOQA

from clwizard.constants import MODULES_LOGS_DIR
from clwizard.exceptions import InstallationFailedException
from clcommon.utils import (
    ExternalProgramFailed,
    is_ea4,
    is_litespeed_running
)
from cldetectlib import is_da, get_apache_modules
from .base import (
    WizardInstaller
)


class LsapiInstaller(WizardInstaller):
    LOG_FILE = os.path.join(MODULES_LOGS_DIR, 'lsapi.log')
    GENERAL_PACKAGE_LIST = ['liblsapi', 'liblsapi-devel', ]
    EA4_LSAPI_PACKAGE = 'ea-apache24-mod_lsapi'
    GENERAL_LSAPI_PACKAGE = 'mod_lsapi'
    UTILITY = '/usr/bin/switch_mod_lsapi'

    def __init__(self):
        super(LsapiInstaller, self).__init__()
        self.lsapi_packages = self.GENERAL_PACKAGE_LIST[:]
        if is_ea4():
            self.lsapi_packages.append(self.EA4_LSAPI_PACKAGE)
        else:
            self.lsapi_packages.append(self.GENERAL_LSAPI_PACKAGE)
        self.apache_modules = get_apache_modules() or []  # type: List[str]

    def _install_lsapi_packages(self):
        """
        Install lsapi packages if needed
        :return: None
        """
        packages_to_install = []
        for package in self.lsapi_packages:
            if not self._is_package_installed(package):
                packages_to_install.append(package)
        if packages_to_install:
            try:
                out = self._install_yum_package(*packages_to_install)
            except ExternalProgramFailed as e:
                self.app_logger.error("Yum failed with error: %s", str(e))
                raise InstallationFailedException()
            self.app_logger.info("Yum package was installed successfully: %s", out)
        else:
            self.app_logger.info("Skip yum package installation, all packages are already installed")

    def _initialize_lsapi(self):
        """
        Configure lsapi on package base installation
        :return: None
        """
        try:
            self._run_command([self.UTILITY, '--setup'])
        except ExternalProgramFailed:
            raise InstallationFailedException()

    def _install_lsapi_on_da(self):
        """
        Configure and build lsapi on DirectAdmin
        :return: None
        """
        try:
            _DA_CUSTOMBUILD = '/usr/local/directadmin/custombuild/build'
            self._run_command([_DA_CUSTOMBUILD, 'update'])
            self._run_command([_DA_CUSTOMBUILD, 'set', 'php1_mode', 'lsphp'])
            self._run_command([_DA_CUSTOMBUILD, 'php', 'n'])
            self._run_command([_DA_CUSTOMBUILD, 'apache'])
        except ExternalProgramFailed:
            raise InstallationFailedException()

    def run_installation(self, options):
        """
        Install lsapi in the system
        :return: None
        """
        if is_da():
            self._install_lsapi_on_da()
        else:
            self._install_lsapi_packages()
            self._initialize_lsapi()

    def _get_warnings(self):
        # type: () -> List
        """
        Get a list of warnings that should be shown in wizard before the module
        installation.
        """
        warnings = []  # type: List[Dict]
        if is_da():
            warnings.append(
                {
                    'message': 'Installation will be performed via DirectAdmin Custombuild tool'
                }
            )
        if 'suexec_module' not in self.apache_modules:
            warnings.append(
                {
                    'message': (
                        'mod_suexec is not installed.'
                        ' It is recommended to use mod_suexec with mod_lsapi.'
                        ' It is also required for CRIU to work.'
                        ' Please see %(url)s for more information.'
                    ),
                    'context': {
                        'url': 'https://docs.cloudlinux.com/apache_mod_lsapi.html'
                    },
                }
            )
        return warnings

    def _get_blockers(self):
        # type: () -> List
        """
        Get a list of possible blockers to disable module in Wizard UI.
        """
        blockers = []
        if is_litespeed_running():
            blockers.append(
                {
                    'message': 'The server is running under Litespeed.'
                               ' mod_lsapi works with Apache server only.'
                               ' Please see %(url)s for the requirements.',
                    'context': {
                        'url': 'https://docs.cloudlinux.com/apache_mod_lsapi.html'
                    }
                }
            )
        if 'ruid2_module' in self.apache_modules:
            blockers.append(
                {
                    'message': 'mod_ruid2 is enabled, it is not compatible with mod_lsapi.'
                               ' Please see %(url)s for the requirements.',
                    'context': {
                        'url': 'https://docs.cloudlinux.com/apache_mod_lsapi.html',
                    }
                }
            )
        if 'mpm_itk_module' in self.apache_modules:
            blockers.append(
                {
                    'message': 'MPM ITK is enabled, it is not compatible with mod_lsapi.'
                               ' Please see %(url)s for the requirements.',
                    'context': {
                        'url': 'https://docs.cloudlinux.com/apache_mod_lsapi.html',
                    }
                }
            )
        return blockers

    def initial_status(self):
        result = {
            'already_configured': all(
                self._is_package_installed(pkg) for pkg in self.lsapi_packages
            )
        }
        warnings = self._get_warnings()
        if warnings:
            result.update({'warnings': warnings})
        blockers = self._get_blockers()
        if blockers:
            result.update({'blockers': blockers})
        return result